1. MPC response overview
As of 11 April 2023, a total of 448,317 persons or 90,324 families
have been reached by MPC interventions. A total of USD 13.3 million has
been disbursed by 17 implementing agencies across 28 sub-districts.
With only certain exceptions (such as activities specified as non-MPC
cash-for-food), only beneficiaries who have received at least USD
100/family/month have been included.
448,000 people reached with MPC, USD 13.3 million disbursed, 11 April 2023governorate | district | communities | partners | households | beneficiaries | total_usd | %_beneficiariesb |
|---|
Aleppo | A'zaz | 5 | 7 | 2,994 | 14,578 | 424,067 | 3.25 |
Aleppo | Afrin | 75 | 10 | 25,162 | 125,312 | 3,726,192 | 27.95 |
Aleppo | Al Bab | 3 | 2 | 998 | 5,011 | 137,791 | 1.12 |
Aleppo | Jarablus | 1 | 3 | 589 | 2,805 | 88,350 | 0.63 |
Aleppo | Jebel Saman | 15 | 8 | 9,226 | 53,754 | 1,380,550 | 11.99 |
Idleb | Harim | 38 | 13 | 43,136 | 204,566 | 6,273,250 | 45.63 |
Idleb | Idleb | 17 | 10 | 5,634 | 28,502 | 879,372 | 6.36 |
Idleb | Jisr-Ash-Shugur | 21 | 3 | 2,585 | 13,789 | 350,200 | 3.08 |
Total | - | - | - | 90,324 | 448,317 | 13,259,772 | 100.00 |
bAs percentage of all MPC beneficiaries reached in NW Syria; |
177,525 beneficiaries were reached in February 2023 and 200,330 were
reached in March 2023. 52,252 have been reached so far in April
2023.Changes in numbers of persons reached were due to cleaning and
verification of the dataset – this process is still ongoing and will
only be completed once the CWG fully transitions to 4W reporting.
1.1 Progress by date

The small number of beneficiaries reached earlier than February all
pertained to the HRP, the only such beneficiaries reported so far. It is
unclear if this is the extent of all January achievements.
3. Geographic breakdown of beneficiaries
Coverage continues to be highest in Afrin and Harim districts, which
have been worst-hit by the earthquake.

Casualties and damaged houses, absolute figures and per 100,000 personsgovernorate | district | wounded_dead1 | wounded_dead_100k1 | damaged_houses1 | damaged_houses_100k1 |
|---|
Aleppo | A'zaz | 356 | 57.87 | 276 | 44.86 |
Aleppo | Afrin | 2,232 | 478.79 | 2,910 | 624.22 |
Aleppo | Al Bab | 206 | 70.04 | 832 | 282.89 |
Aleppo | Jarablus | 40 | 33.82 | 257 | 217.30 |
Aleppo | Jebel Saman | 616 | 236.80 | 176 | 67.66 |
Idleb | Harim | 8,449 | 507.65 | 3,230 | 194.07 |
Idleb | Idleb | 350 | 48.23 | 946 | 130.37 |
Idleb | Jisr-Ash-Shugur | 595 | 183.68 | 1,915 | 591.18 |
1Data from the Assistance Coordination Unit, Syria 20230328; |
Below is a breakdown of beneficiaries based on whether they originate
from camps or villages:
More than twice as many beneficiaries from villages as from campsvillage_camps | beneficiaries | %_beneficiaries |
|---|
camp | 94,430 | 21.06 |
village | 228,690 | 51.01 |
NA | 125,197 | 27.93 |
3.1 By sub-district
The plots below show the breakdown of beneficiaries by sub-district.
Caution must be taken to ensure that allocations are fair across the
affected areas: there are numerous sub-districts where a very large
proportion of the total population has already been reached by
multi-purpose cash, in particular, Jandairis, Hairm, Salqin and
Sharan.
Response activities must be proportional with the magnitude and
severity of earthquake damage. Overallocation deprives affected persons
of the aid they are due.
The average percentage of the population reached, of all
sub-districts, is 10.63%.

3.2 Comparisons with PIN and earthquake damage
The plot below shows the total population of each sub-district on the
x-axis (for the moment, all persons in these areas are assumed to be
affected and are included in the PIN) and the number of beneficiaries on
the y-axis.
The size of each point indicates the number of dead or wounded
persons there per 100,000.

The higher or lower a sub-district is above the blue line, the more
disproportionate the number of beneficiaries allocated to that location
are.
This should also be compared to each sub-district’s share of the
earthquake damage. Of particular note, sub-districts in grey have yet to
receive any MPC assistance.

The CWG is currently working on a prioritisation score, which can be
a useful shorthand, that will take into account pre-existing
vulnerability (likely from the MSNA) as well as earthquake impacts.
3.3 Planned activities

4. Cash response actors and cash disbursed
In the scatterplot below, each point is a single cash working group
partner. The x-axis indicates the number of beneficiaries reached per
agency and the y-axis indicates the number of communities (admin4)
reached.
USD 13.3 million has been distributed across 174 communities and 28
sub-districts in NW Syria.
The table below summarises the information in the scatterplot above
in tabular form:
Reach and footprint of cash response actorsimplementing_partner1 | beneficiaries | districts | communities |
|---|
CBRTWG-006 | 67,989 | 3 | 20 |
People in Need (PIN) | 36,144 | 3 | 25 |
GOAL (GOAL) | 34,310 | 3 | 70 |
CBRTWG-010 | 33,115 | 5 | 15 |
Norwegian Refugee Council (NRC) | 20,900 | 2 | 5 |
CBRTWG-035 | 14,197 | 5 | 27 |
Mercy Without Limits | 13,016 | 4 | 10 |
Bahar Organization (BO) | 12,000 | 1 | 1 |
Agency for Technical Cooperation and Development (ACTED) | 10,481 | 7 | 28 |
Uluslararasi Insani Yardimlasma Dernegi (IYD) | 10,351 | 4 | 16 |
Syria Relief | 9,750 | 5 | 7 |
Ihsan for Relief and Development | 8,655 | 5 | 16 |
World Vision International (WVI) | 7,008 | 1 | 4 |
Welthungerhilfe (WHH) | 4,830 | 4 | 4 |
Ataa Humanitarian Relief Association (ATAA) | 3,060 | 1 | 2 |
MASRRAT | 2,692 | 3 | 3 |
Elaf for relief and development | 1,750 | 1 | 1 |
1Only partners who provided more than USD 100/family/month; |
4.1 USD disbursed per partner
USD disbursed and families reached by partnerimplementing_partner | total_usd | families | usd_per_fam | %_usd_total |
|---|
GOAL (GOAL) | 2,998,650 | 19,991 | 150.00 | 22.61 |
CBRTWG-006 | 1,773,750 | 11,825 | 150.00 | 13.38 |
CBRTWG-010 | 1,590,100 | 11,287 | 140.88 | 11.99 |
Norwegian Refugee Council (NRC) | 1,266,450 | 8,443 | 150.00 | 9.55 |
People in Need (PIN) | 927,450 | 6,183 | 150.00 | 6.99 |
Ihsan for Relief and Development | 854,250 | 5,695 | 150.00 | 6.44 |
Syria Relief | 724,500 | 4,830 | 150.00 | 5.46 |
Agency for Technical Cooperation and Development (ACTED) | 515,350 | 3,373 | 152.79 | 3.89 |
Mercy Without Limits | 438,372 | 3,325 | 131.84 | 3.31 |
CBRTWG-035 | 409,800 | 4,098 | 100.00 | 3.09 |
Uluslararasi Insani Yardimlasma Dernegi (IYD) | 375,000 | 2,500 | 150.00 | 2.83 |
Bahar Organization (BO) | 360,000 | 2,400 | 150.00 | 2.71 |
Welthungerhilfe (WHH) | 344,400 | 2,296 | 150.00 | 2.60 |
World Vision International (WVI) | 301,200 | 2,008 | 150.00 | 2.27 |
Ataa Humanitarian Relief Association (ATAA) | 177,000 | 1,180 | 150.00 | 1.33 |
Elaf for relief and development | 122,500 | 350 | 350.00 | 0.92 |
MASRRAT | 81,000 | 540 | 150.00 | 0.61 |
The CWG is currently working with other Clusters to consolidate all
cash-based activities and will soon be able to provide more
comprehensive reporting.
5. Annexes
5.1 Interactive reference table at sub-district level
Columns include: governorate, district,
sub-district, total population,
beneficiaries, total usd disbursed,
wounded and dead, wounded and dead per 100k,
damaged houses, damaged houses per 100k,
admin3pcode
5.2 Reporting quality
This section documents issues encountered in the cleaning of 4W and
FSL data and their impacts on the quality of reporting the CWG can
provide.
Note that substantial cleaning has already taken place and these
outstanding issues could not be resolved by the time of reporting.
However, the CWG recognises that not all reporting issues were due to
partner error. The CWG will work with partners to continue improving
reporting quality.
Still, one third of reporting originates from the FSL trackersource | partners | beneficiaries | %_beneficiaries |
|---|
4ws | 11 | 308,417 | 68.79 |
fsl_tracker | 7 | 139,900 | 31.21 |
Below is a breakdown of reporting by date:
January reporting is still largely incompletemonth | partners | beneficiaries | %_beneficiaries |
|---|
Jan | 2 | 3,778 | 0.84 |
Feb | 8 | 177,525 | 39.60 |
Mar | 10 | 200,330 | 44.68 |
Apr | 5 | 52,252 | 11.66 |
| 1 | 14,432 | 3.22 |
Activities pertaining to 14,432 were missing their date or had dates
in unreadable formats. However, the columns start date,
end date and month of reporting were some of
the most troublesome and consumed a large part of the time dedicated to
data cleaning.
The CWG would like to reiterate that start date and
end date should be entered in the format mm/dd/yyyy and
that month of reporting should be selected from the
dropdown menu.
12 partners have reported planned activitiesproject_status | partners | beneficiaries | %_beneficiaries |
|---|
Completed | 17 | 448,317 | 87.83 |
Planned | 12 | 62,129 | 12.17 |
Suspended | 1 | 0 | 0.00 |
The sum of planned beneficiaries is 62,129. If this is the extent of
all planned MPC activities, the CWG as a whole can expect to reach
around 77% of its target of 662,942 persons.
Below is a breakdown of planned actitivities by source:
Breakdown of planned activities by sourcesource | partners | beneficiaries | %_beneficiaries |
|---|
4ws | 7 | 40,542 | 65.25 |
fsl_tracker | 5 | 21,587 | 34.75 |
5.3 Disaggregations
Of the 565 rows reported through the 4Ws (the FSL tracker does not
ask for beneficiary disaggregations), only 32 have any values for the
numbers of elderly persons reached.
The total number of elderly persons reached by the CWG partners is
3,190. The total number of beneficiaries reached is 448,317.
It is unclear how able partners are to comply with sex- and
age-disaggregated reporting. 452 of the 565 rows reported through the
4Ws contain some form of sex-and-age disaggregation. Of these, only 366
rows have not copy/pasted the disaggregations from the MSNA (13% men,
27% women, 28% boys and 31% girls). For analysis purposes, these have
been discarded. In future, it is always preferable to leave
disaggregation columns blank as opposed to including values that have
been backfilled from a census or a survey, especially as this
backfilling will be done by OCHA as a final step in reporting
anyway.
This is a histogram of the remaining values:

This differs quite significantly from what we would expect to see in
the general population and is indicative of “unnatural” data
i.e. copy/pasting or broad estimations, as opposed to actual counts. The
peaks around 49% and 50% show that these same percentages were
copy/pasted onto a large number of rows.
For reference, this the percentage of males as a proportion of the
people in need per sub-district. The distribution is roughly normal and
we can see that these are “real” figures.

Until such time copy/pasted values are excluded from the sex-and-age
disggregations, it would be incorrect to estimate the number of men,
women, boys and girls reached from the 4W values. This also means that
it is not possible to determine if there is a skew towards either sex in
our current programming.
LS0tDQp0aXRsZTogIk5vcnRod2VzdCBTeXJpYSBDYXNoIFdvcmtpbmcgR3JvdXAgRWFydGhxdWFrZSBSZXNwb25zZSBCdWxsZXRpbiINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk5XUy1DV0cgbG9nby5QTkciKTsNCiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOw0KICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyOw0KICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KfQ0KYGBgDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCiAgICBib2R5IC5tYWluLWNvbnRhaW5lciB7DQogICAgICAgIG1heC13aWR0aDogMTI4MHB4Ow0KICAgIH0NCjwvc3R5bGU+DQpgYGANCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShza2ltcikNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZmxleHRhYmxlKQ0KbGlicmFyeShzbmFrZWNhc2UpDQpsaWJyYXJ5KGFyYWJpY1N0ZW1SKQ0KbGlicmFyeSh3cml0ZXhsKQ0KbGlicmFyeShtZGVwcml2KQ0KbGlicmFyeShnZ3JlcGVsKQ0KDQp0aGVtZV9zZXQodGhlbWVfbGlnaHQoKSkNCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCiMgcGFuZGVyIHRhYmxlcyBhbGwgaW4gb25lIHJvdw0KcGFuZGVyT3B0aW9ucygndGFibGUuc3BsaXQudGFibGUnLCBJbmYpDQoNCiMgcGFuZGVyIHRob3VzYW5kcyBzZXBhcmF0b3INCnBhbmRlck9wdGlvbnMoImJpZy5tYXJrIiwgIiwiKQ0KDQojIHJlcGxhY2UgDQpvcHRzIDwtIG9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAiIikNCg0KYCVvdXQlYCA8LSBOZWdhdGUoYCVpbiVgKQ0KDQojIGZ1bmN0aW9uIGZvciB0cmFuc3Bvc2luZyBkZg0KdHJhbnNwb3NlX2RmIDwtIGZ1bmN0aW9uKGRmKSB7DQogIHRfZGYgPC0gZGF0YS50YWJsZTo6dHJhbnNwb3NlKGRmKQ0KICBjb2xuYW1lcyh0X2RmKSA8LSByb3duYW1lcyhkZikNCiAgcm93bmFtZXModF9kZikgPC0gY29sbmFtZXMoZGYpDQogIHRfZGYgPC0gdF9kZiAlPiUNCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguZGF0YSA9IC4pICU+JQ0KICAgIHRpYmJsZTo6YXNfdGliYmxlKC4pDQogIHJldHVybih0X2RmKQ0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcw0Kc3VtX2JlbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3Zhcil7DQogIA0KICBjb2x1bW5fdmFyIDwtIGVucXVvKGNvbHVtbl92YXIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcywgMiBncm91cGVkIHZhcmlhYmxlcw0Kc3VtX2JlbjIgPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIxLCBjb2x1bW5fdmFyMil7DQogIA0KICBjb2x1bW5fdmFyMSA8LSBlbnF1byhjb2x1bW5fdmFyMSkNCiAgY29sdW1uX3ZhcjIgPC0gZW5xdW8oY29sdW1uX3ZhcjIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIxLCAhIWNvbHVtbl92YXIyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikNCiAgICANCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiNtb2RlIGZ1bmN0aW9uIA0KbW9kZSA8LSBmdW5jdGlvbih4KSB7DQogIHV4IDwtIHVuaXF1ZSh4KQ0KICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldDQp9DQoNCmxvY2F0aW9ucyA8LSByZWFkX2V4Y2VsKCIuL2RhdGEvTG9jYXRpb25zLnhsc3giKSAlPiUgDQogIGNsZWFuX25hbWVzKCkNCg0KcGNvZGUzX3NoYXBlIDwtIA0KICBzdF9yZWFkKCIuL2RhdGEvc3lyX2FkbWJuZGFfdW5jc191bm9jaGFfMjAyMDEyMTcvc3lyX2FkbWJuZGFfYWRtM191bmNzX3Vub2NoYV8yMDIwMTIxNy5zaHAiKQ0KDQphcmFiaWNfbGFiZWxzIDwtIGZ1bmN0aW9uKHgpIHBhc3RlMCgiXHUyMDJiIiwgeCkNCg0KcmVwb3J0X2RhdGUgPC0gIjExIEFwcmlsIDIwMjMiDQpgYGANCg0KDQpgYGB7ciBkYXRhfQ0KbmFtZXNfZXEgPC0gYygNCiAgImRhdGUiLA0KICAiZ292ZXJub3JhdGUiLA0KICAiZGlzdHJpY3QiLA0KICAic3ViX2Rpc3RyaWN0IiwNCiAgImNvbW11bml0eSIsDQogICJhZG1pbjQiLA0KICAiY2FzdWFsdGllcyIsDQogICJpbmp1cmllcyIsDQogICJjb21wbGV0ZWx5X2Rlc3Ryb3llZF9ob3VzZXMiLA0KICAiZGFtYWdlZF91bmloYWJpdGFibGVfaG91c2VzIiwNCiAgInRlbXBvcmFyeV9hY2NvbW1vZGF0aW9uX2NlbnRyZXMiLA0KICAiaWRwc19pbl9hbGxfY2VudHJlcyIsDQogICJzY2hvb2xzX2FzX2FjY29tb2RhdGlvbl9jZW50cmVzIiwNCiAgImlkcHNfaW5fc2Nob29scyIsDQogICJ0ZW50c19uZWVkZWQiLA0KICAiYmxhbmtldHNfbWF0dHJlc3Nlc19uZWVkZWQiLA0KICAidGVtcG9yYXJ5X2FjY29tbW9kYXRpb25fY2VudHJlc19hdmFpbGFibGUiLCANCiAgImFjY2Vzc2libGVfY2l2aWxfZGVmZW5zZSIsDQogICJsYXRyaW5lc19hdmFpbGFibGUiLA0KICAibWVhbHNfbmVlZGVkX3Blcl9kYXkiLA0KICAibmVlZF9ibG9vZF9kb25hdGlvbnMiLA0KICAiaGVhbHRoX3NlcnZpY2VzX2F2YWlsYWJsZSIsDQogICJuZWNlc3NhcnlfbWVkaWNhbF9lcXVpcG1lbnQiLA0KICAicnViYmxlX3ZvbHVudGVlcnMiLA0KICAidGVsZWNvbXNfYXZhaWxhYmxlIiwNCiAgImVsZWN0cmljaXR5X2F2YWlsYWJsZSIsIA0KICAiaGVhdGluZ19mdWVsX25lZWRlZCINCikNCg0KZXEgPC0gcmVhZF9leGNlbCgiLi9kYXRhL3N5cmlhLWVhcnRocXVha2UtaW1wYWN0LTIwLW1hcmNoLTIwMjMueGxzeCIsDQogICAgICAgICAgICAgICAgIHNoZWV0ID0gIkRBVEFTRVQiKSAlPiUgDQogIHNldE5hbWVzKG5hbWVzX2VxKSAlPiUgDQogIGxlZnRfam9pbihsb2NhdGlvbnMgJT4lIHNlbGVjdChhZG1pbjRwY29kZSwgYWRtaW4zcGNvZGUpLCANCiAgICAgICAgICAgIGJ5ID0gYygiYWRtaW40IiA9ICJhZG1pbjRwY29kZSIpKSAlPiUgDQogIG11dGF0ZSh3b3VuZGVkX2RlYWQgPSBjYXN1YWx0aWVzICsgaW5qdXJpZXMsDQogICAgICAgICAgICAgZGFtYWdlZF9ob3VzZXMgPSBjb21wbGV0ZWx5X2Rlc3Ryb3llZF9ob3VzZXMgKyBkYW1hZ2VkX3VuaWhhYml0YWJsZV9ob3VzZXMpICU+JSANCiAgICAgIGdyb3VwX2J5KGFkbWluM3Bjb2RlKSAlPiUgDQogICAgICBzdW1tYXJpc2Uod291bmRlZF9kZWFkID0gc3VtKHdvdW5kZWRfZGVhZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgZGFtYWdlZF9ob3VzZXMgPSBzdW0oZGFtYWdlZF9ob3VzZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbGVmdF9qb2luKHJlYWRfZXhjZWwoIi4vZGF0YS8yMDIzSE5PX1BpTl9TZXZlcml0eV9kZXRhaWxlZEFvSV9GT1JTSEFSRSAxNTAzMjAyMy54bHN4Iiwgc2tpcCA9IDEsIA0KICAgICAgICAgICAgICAgICAgc2hlZXQgPSAxKSAlPiUNCiAgICAgICAgICAgICAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFkbWluM3Bjb2RlLCB0b3RhbF9wb3B1bGF0aW9uKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgbXV0YXRlKHdvdW5kZWRfZGVhZF8xMDBrID0gd291bmRlZF9kZWFkIC8gdG90YWxfcG9wdWxhdGlvbiAqIDEwMDAwMCwgDQogICAgICAgICBkYW1hZ2VkX2hvdXNlc18xMDBrID0gZGFtYWdlZF9ob3VzZXMgLyB0b3RhbF9wb3B1bGF0aW9uICogMTAwMDAwKQ0KDQoNCmVxX21kZXByaXYgPC0gZXEgJT4lDQogIG11dGF0ZV9hdCh2YXJzKHdvdW5kZWRfZGVhZCwgZGFtYWdlZF9ob3VzZXMsIA0KICAgICAgICAgICAgICAgICB3b3VuZGVkX2RlYWRfMTAwaywgZGFtYWdlZF9ob3VzZXNfMTAwayksIH4gcmFuZ2Vfd25hKC4pKSAlPiUgDQogIG1kZXByaXYoYygid291bmRlZF9kZWFkIiwgImRhbWFnZWRfaG91c2VzIiwgDQogICAgICAgICAgICAid291bmRlZF9kZWFkXzEwMGsiLCAiZGFtYWdlZF9ob3VzZXNfMTAwayIpLCANCiAgICAgICAgICBtZXRob2QgPSAiY3oiLCBvdXRwdXQgPSAiYWxsIiwgDQogICAgICAgICAgc2NvcmVfaV9oZWFkaW5nID0gImVxX3Njb3JlIikNCg0KZXEgPC0gZXEgJT4lIA0KICBsZWZ0X2pvaW4oZXFfbWRlcHJpdiRkYXRhICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFkbWluM3Bjb2RlLCBlcV9zY29yZSksIA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKQ0KDQojIFRoaW5rIG9mIGFub3RoZXIgd2F5IHRvIGRvIHRoaXMgLS0gaWYgc29tZW9uZSBlbHNlIHJ1bnMgdGhpcywgaXQgd29uJ3Qgd29yayANCmNiciA8LSByZWFkX2NzdigiLi9kYXRhL2Nicl9jb20uY3N2IikgJT4lIA0KICBtdXRhdGUobW9udGggPSBtb250aChkaXN0cmlidXRpb25fZGF0ZSkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGJlbmVmaWNpYXJpZXMgPSAwKSkgDQogIA0KDQpobm8gPC0gcmVhZF9leGNlbCgiLi9kYXRhLzIwMjNITk9fUGlOX1NldmVyaXR5X2RldGFpbGVkQW9JX0ZPUlNIQVJFIDE1MDMyMDIzLnhsc3giLCBza2lwID0gMSwgDQogICAgICAgICAgICAgICAgICBzaGVldCA9IDEpICU+JQ0KICBjbGVhbl9uYW1lcygpDQoNCg0KbndfcGNvZGUzIDwtIGhubyAlPiUgDQogIGZpbHRlcihhb19jID09ICJOVyIpICU+JSANCiAgcHVsbChhZG1pbjNwY29kZSkNCg0KZm91ciA8LSByZWFkX2NzdigiLi9kYXRhLzR3cy5jc3YiKQ0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMgMS4gTVBDIHJlc3BvbnNlIG92ZXJ2aWV3DQoNCkFzIG9mIDExIEFwcmlsIDIwMjMsIGEgdG90YWwgb2YgYHIgY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIG9yIGByIGNiciAlPiUgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGZhbWlsaWVzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgZmFtaWxpZXMgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgTVBDIGludGVydmVudGlvbnMuIA0KQSB0b3RhbCBvZiBVU0QgYHIgcGFzdGUoZm9ybWF0KHJvdW5kKChjYnIgJT4lIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lICB7c3VtKC4kdG90YWxfdXNkKX0pIC8gMTAwMDAwMCwgMSksIHRyaW0gPSBUUlVFKSwgIm1pbGxpb24iKWAgaGFzIGJlZW4gZGlzYnVyc2VkIGJ5IGByIGNiciAlPiUgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgc3VtbWFyaXNlKG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpKSAlPiUgcHVsbCgpYCBpbXBsZW1lbnRpbmcgYWdlbmNpZXMgYWNyb3NzIGByIGNiciAlPiUgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgc3VtbWFyaXNlKG5fZGlzdGluY3QoYWRtaW4zcGNvZGUpKSAlPiUgcHVsbCgpYCBzdWItZGlzdHJpY3RzLiANCg0KV2l0aCBvbmx5IGNlcnRhaW4gZXhjZXB0aW9ucyAoc3VjaCBhcyBhY3Rpdml0aWVzIHNwZWNpZmllZCBhcyBub24tTVBDIGNhc2gtZm9yLWZvb2QpLCBvbmx5IGJlbmVmaWNpYXJpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgYXQgbGVhc3QgVVNEIDEwMC9mYW1pbHkvbW9udGggaGF2ZSBiZWVuIGluY2x1ZGVkLg0KDQo8YnI+DQoNCmBgYHtyIHN1bW1hcnkgdGFibGV9DQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JQ0KICBncm91cF9ieShnb3Zlcm5vcmF0ZSwgZGlzdHJpY3QpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgY29tbXVuaXRpZXMgPSBuX2Rpc3RpbmN0KGFkbWluNHBjb2RlKSwgDQogICAgICAgICAgICBob3VzZWhvbGRzID0gc3VtKGZhbWlsaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICB0b3RhbF91c2QgPSBzdW0odG90YWxfdXNkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IA0KICAgICAgICAgICByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUNCiAgYWRvcm5fdG90YWxzKCJyb3ciLCwsLCBob3VzZWhvbGRzLCBiZW5lZmljaWFyaWVzLCB0b3RhbF91c2QsIGAlX2JlbmVmaWNpYXJpZXNgKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IGlmZWxzZShgJV9iZW5lZmljaWFyaWVzYCA+IDk5Ljk4LCAxMDAsIGAlX2JlbmVmaWNpYXJpZXNgKSkgJT4lIA0KICBzZWxlY3QoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCBjb21tdW5pdGllcywgcGFydG5lcnMsIA0KICAgICAgICAgaG91c2Vob2xkcywgYmVuZWZpY2lhcmllcywgdG90YWxfdXNkLCBgJV9iZW5lZmljaWFyaWVzYCkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiNDQ4LDAwMCBwZW9wbGUgcmVhY2hlZCB3aXRoIE1QQywgVVNEIDEzLjMgbWlsbGlvbiBkaXNidXJzZWQsICIsIHJlcG9ydF9kYXRlKSkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiMgIGZvb3Rub3RlKGkgPSAxLCBqID0gNiwgcGFydCA9ICJoZWFkZXIiLCByZWZfc3ltYm9scyA9ICJhIiwNCiMgICAgICAgICAgIGFzX3BhcmFncmFwaCgiQmVuZWZpY2lhcnkgZmlndXJlcyBpbmNsdWRlIG9ubHkgcmVwb3J0ZWQgTVBDIHdpdGggYSBtaW5pbXVtIHRyYW5zZmVyIHZhbHVlICNvZiBVU0QgMTAwIikpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSA4LCBwYXJ0ID0gImhlYWRlciIsIHJlZl9zeW1ib2xzID0gImIiLCBpbmxpbmUgPSBUUlVFLCAgDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiQXMgcGVyY2VudGFnZSBvZiBhbGwgTVBDIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiBOVyBTeXJpYSIpKSANCg0KDQpgYGANCg0KDQpgYGB7ciBldmFsID0gRkFMU0V9DQoNCiMgSnVzdCBicmVha2Rvd24gYnkgbW9udGggLS0gZG9uJ3Qga25vdyB3aHkgSSBkaWQgYSBsaW5lIHBsb3QgaW5zdGVhZCBvZiBhIGJhcnBsb3QsIA0KIyBtYXliZSBiYXJwbG90IHdoZW4gdGhlcmUgYXJlIG1vcmUgbW9udGhzIA0KDQpjYnIgJT4lIA0KICBtdXRhdGUobW9udGggPSBtb250aChkaXN0cmlidXRpb25fZGF0ZSkpICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIA0KICBncm91cF9ieShtb250aCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKQ0KDQpjYnIgJT4lIGNvdW50KGltcGxlbWVudGluZ19wYXJ0bmVyLCBwYXJ0bmVyX2NvZGUpDQoNCmBmaWx0ZXIoY2JyLCBtb250aCA9PSAyICYgcHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgDQoNCmBgYA0KDQo8YnI+DQoNCmByIGZpbHRlcihjYnIsIG1vbnRoID09IDIgJiBwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgaW4gRmVicnVhcnkgMjAyMyBhbmQgYHIgZmlsdGVyKGNiciwgbW9udGggPT0gMyAmIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIHJlYWNoZWQgaW4gTWFyY2ggMjAyMy4gYHIgZmlsdGVyKGNiciwgbW9udGggPT0gNCAmIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBoYXZlIGJlZW4gcmVhY2hlZCBzbyBmYXIgaW4gQXByaWwgMjAyMy5DaGFuZ2VzIGluIG51bWJlcnMgb2YgcGVyc29ucyByZWFjaGVkIHdlcmUgZHVlIHRvIGNsZWFuaW5nIGFuZCB2ZXJpZmljYXRpb24gb2YgdGhlIGRhdGFzZXQgLS0gdGhpcyBwcm9jZXNzIGlzIHN0aWxsIG9uZ29pbmcgYW5kIHdpbGwgb25seSBiZSBjb21wbGV0ZWQgb25jZSB0aGUgQ1dHIGZ1bGx5IHRyYW5zaXRpb25zIHRvIDRXIHJlcG9ydGluZy4gDQoNCiAgDQogIA0KDQpgYGB7ciBldmFsPUZBTFNFfQ0KY2JyICU+JSANCiAgbXV0YXRlKGRpc3RyaWJ1dGlvbl9kYXRlID0gYXMuRGF0ZShkaXN0cmlidXRpb25fZGF0ZSkpICU+JSANCiAgZmlsdGVyKGRpc3RyaWJ1dGlvbl9kYXRlID09ICIwMDIyLTAxLTIwIikgJT4lIA0KICB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0NCmBgYA0KDQo8YnI+PGJyPg0KDQojIyAxLjEgUHJvZ3Jlc3MgYnkgZGF0ZQ0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQpjYnIgJT4lDQogIG11dGF0ZShkaXN0cmlidXRpb25fZGF0ZSA9IGFzLkRhdGUoZGlzdHJpYnV0aW9uX2RhdGUpKSAlPiUgDQogIGZpbHRlcighaXMubmEoZGlzdHJpYnV0aW9uX2RhdGUpKSAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShkaXN0cmlidXRpb25fZGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lDQogIGFycmFuZ2UoZGlzdHJpYnV0aW9uX2RhdGUpICU+JSANCiAgZmlsdGVyKGRpc3RyaWJ1dGlvbl9kYXRlICE9ICIwMDIyLTAxLTIwIikgJT4lIA0KICBtdXRhdGUoaWZlbHNlKGRpc3RyaWJ1dGlvbl9kYXRlID4gIjIwMjMtMDQtMTEiLCAiMjAyMy0wNC0xMSIsIGRpc3RyaWJ1dGlvbl9kYXRlKSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoY3VtX2xhYmVsID0gaWZlbHNlKGRpc3RyaWJ1dGlvbl9kYXRlID09ICIyMDIzLTAyLTA5IiB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX2RhdGUgPT0gIjIwMjMtMDMtMDIiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXN0cmlidXRpb25fZGF0ZSA9PSAiMjAyMy0wMy0yMiIgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX2RhdGUgPT0gIjIwMjMtMDMtMzAifA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX2RhdGUgPT0gIjIwMjMtMDQtMTUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW1fYmVuLCAiIiksIA0KICAgICAgICAgY3VtX2xhYmVsID0gYXMubnVtZXJpYyhjdW1fbGFiZWwpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZGlzdHJpYnV0aW9uX2RhdGUsIHkgPSBjdW1fYmVuKSkgKyANCiAgZ2VvbV9saW5lKGNvbG91ciA9ICJibHVlIikgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6Y29tbWEoY3VtX2xhYmVsKSksIHZqdXN0ID0gLS42LCANCiAgICAgICAgICAgIHNpemUgPSA0KSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSB3ZWVrIiwgZGF0ZV9sYWJlbHMgPSAiJWQtJWIiKSArDQogICMgV2h5IGRpZG4ndCB5b3UgbGVhcm4gdGhpcyBiZWZvcmU/IA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gLjEpKSArIA0KICBsYWJzKHggPSAiRGlzdHJpYnV0aW9uIGRhdGUiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIk1QQyBwcm9ncmVzcyBieSBkYXRlIiwgDQogICAgICAgc3VidGl0bGUgPSAiVGhlIGVhcmxpZXN0IGVhcnRocXVha2UtcmVsYXRlZCBkaXN0cmlidXRpb24gd2FzIDIwMjMtMDItMDlcbkV4Y2x1ZGVzIDE2LDQ2MCBiZW5lZmljaWFyaWVzIGZvciB3aGljaCB0aGUgZGF0ZSB3YXMgbm90IHJlcG9ydGVkIG9yIHdhcyB1bnJlYWRhYmxlIikgIA0KICANCiMgZ2dzYXZlKCIuL2ltZy9wcm9ncmVzc19saW5lLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gOC4yNywgd2lkdGggPSAxMS42OSwgdW5pdHMgPSAiaW4iKSAgDQpgYGANCg0KPGJyPg0KDQpUaGUgc21hbGwgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBlYXJsaWVyIHRoYW4gRmVicnVhcnkgYWxsIHBlcnRhaW5lZCB0byB0aGUgSFJQLCB0aGUgb25seSBzdWNoIGJlbmVmaWNpYXJpZXMgcmVwb3J0ZWQgc28gZmFyLiBJdCBpcyB1bmNsZWFyIGlmIHRoaXMgaXMgdGhlIGV4dGVudCBvZiBhbGwgSmFudWFyeSBhY2hpZXZlbWVudHMuIA0KDQo8YnI+PGJyPg0KDQojIDIuIE1hcCBvZiBhY3Rpdml0aWVzDQoNCjxicj4NCg0KYGBge3IgZmlnLmhlaWdodD03fQ0KDQpwbGFubmVkX2ltcGxlbWVudGVkX21hcCA8LSBjYnIgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSBjKCJhZG1pbjNwY29kZSIgPSAiQURNM19QQ09ERSIpKSAlPiUgDQogIGZpbHRlcihBRE0xX1BDT0RFICVpbiUgYygiU1kwMiIsICJTWTA3IikgJiAhaXMubmEoYmVuZWZpY2lhcmllcykpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUNCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjEsIGNvbG91ciA9ICJncmV5NzAiKSArIA0KICBnZW9tX3BvaW50KGFlcyhzaXplID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgICAgICAgY29sb3VyID0gcHJvamVjdF9zdGF0dXMsIA0KICAgICAgICAgICAgICAgICB4ID0gbG9uZ2l0dWRlX3gsIHkgPSBsYXRpdHVkZV95LCANCiAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCgic3ViX2Rpc3RyaWN0OiAiLCBzdWJfZGlzdHJpY3QsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW11bml0eTogIiwgY29tbXVuaXR5LCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbl90eXBlOiAiLCB2aWxsYWdlX2NhbXBzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiIsIGZvcm1hdChiZW5lZmljaWFyaWVzLCBiaWcubWFyayA9ICIsIiksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRuZXI6ICIsIGFiYnJldmlhdGlvbiwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbl94OiAiLCBsb25naXR1ZGVfeCwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF0X3k6ICIsIGxhdGl0dWRlX3kpKSwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgc3Ryb2tlID0gLjM1LCANCiAgICAgICAgICAgICBhbHBoYSA9IC41KSArIA0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIHNjYWxlX2NvbG91cl92aXJpZGlzX2QobmEudHJhbnNsYXRlID0gRkFMU0UpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9IE5BKSwgDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksKSArDQogIGxhYnModGl0bGUgPSAiQ29tbXVuaXRpZXMgcmVhY2hlZCBhbmQgcGxhbm5lZCAtLSBDV0cgcGFydG5lcnMiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJQbGFubmVkIGluIHllbGxvdywgY29tcGxldGVkIGluIHB1cnBsZSwgc2l6ZSBzaG93cyBudW1iZXIgb2YgcGVyc29ucyIsIA0KICAgICAgIGNvbG91ciA9ICJTdGF0dXMiKSArDQogIGd1aWRlcyhzaXplID0gIm5vbmUiKQ0KDQogIA0KZ2dwbG90bHkocGxhbm5lZF9pbXBsZW1lbnRlZF9tYXAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JSANCiAgcGxvdGx5OjpzdHlsZShob3Zlcm9uID0gInBvaW50IikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkNvbW11bml0aWVzIHJlYWNoZWQgYW5kIHBsYW5uZWQgLS0gQ1dHIHBhcnRuZXJzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxhbm5lZCBpbiB5ZWxsb3csIGNvbXBsZXRlZCBpbiBwdXJwbGUsIHNpemUgc2hvd3MgbnVtYmVyIG9mIHBlcnNvbnM7IGNsaWNrIGFuZCBkcmFnIHRvIHpvb207IG1vdXNlIG92ZXIgZm9yIGRldGFpbHMiKSkpDQogIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIDMuIEdlb2dyYXBoaWMgYnJlYWtkb3duIG9mIGJlbmVmaWNpYXJpZXMgDQoNCkNvdmVyYWdlIGNvbnRpbnVlcyB0byBiZSBoaWdoZXN0IGluIEFmcmluIGFuZCBIYXJpbSBkaXN0cmljdHMsIHdoaWNoIGhhdmUgYmVlbiB3b3JzdC1oaXQgYnkgdGhlIGVhcnRocXVha2UuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShkaXN0cmljdCA9IGZjdF9yZW9yZGVyKGRpc3RyaWN0LCBiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICBnb3Zlcm5vcmF0ZSA9IGZjdF9yZWxldmVsKGdvdmVybm9yYXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiSWRsZWIiLCAiQWxlcHBvIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBkaXN0cmljdCkpICsgDQogIGdlb21fY29sKGFlcyhmaWxsID0gZ292ZXJub3JhdGUpKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjMpICsgDQogIGxhYnModGl0bGUgPSAiTVBDIGJlbmVmaWNpYXJpZXMgYnkgZGlzdHJpY3QiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJhcyBvZiAxMSBBcHJpbCAyMDIzIiwgDQogICAgICAgeSA9ICIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQoNCmhubyAlPiUgDQogIGZpbHRlcihhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlID0gYWRtaW4xbmFtZV9lbiwgZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9wb3B1bGF0aW9uID0gc3VtKHRvdGFsX3BvcHVsYXRpb24sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBsZWZ0X2pvaW4oDQogICAgY2JyICU+JQ0KICAgICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgIA0KICAgICAgZ3JvdXBfYnkoZGlzdHJpY3QpICU+JSANCiAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICwgIA0KICBieSA9ICJkaXN0cmljdCIpICU+JSANCiAgbXV0YXRlKGRpc3RyaWN0ID0gZmN0X3JlbGV2ZWwoZGlzdHJpY3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWwgQmFiIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXJhYmx1cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSd6YXoiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkplYmVsIFNhbWFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmlzci1Bc2gtU2h1Z3VyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZGxlYiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGFyaW0iKSwNCiAgICAgICAgIHBjX3JlYWNoZWQgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gdG90YWxfcG9wdWxhdGlvbiAqIDEwMCwgZGlnaXRzID0gMSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGNfcmVhY2hlZCwgeSA9IGRpc3RyaWN0KSkgKw0KICBnZW9tX2NvbChhZXMoZmlsbCA9IGdvdmVybm9yYXRlKSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHBjX3JlYWNoZWQpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjMpICsgDQogIGxhYnModGl0bGUgPSAiUGVyY2VudCBvZiBwb3B1bGF0aW9uIHJlYWNoZWQiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJhcyBvZiAxMSBBcHJpbCAyMDIzIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB4ID0gIiUgb2YgcG9wdWxhdGlvbiByZWFjaGVkIikgKw0KICANCiAgcGxvdF9sYXlvdXQoZ3VpZGVzID0gImNvbGxlY3QiKSAmIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCg0KZ2dzYXZlKCIuL2ltZy9tcGNfYnlfZGlzdHJpY3QucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA4LjI3LCB3aWR0aCA9IDExLjY5LCB1bml0cyA9ICJpbiIpICANCg0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQplcSAlPiUgDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbiwgDQogICAgICAgICAgICAgICAgICAgICBzdWJfZGlzdHJpY3QgPSBhZG1pbjNuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGFkbWluM3Bjb2RlKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgZmlsdGVyKGFkbWluM3Bjb2RlICVpbiUgbndfcGNvZGUzICYgDQogICAgICAgICAgIGRpc3RyaWN0ICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lIA0KICBncm91cF9ieShnb3Zlcm5vcmF0ZSwgZGlzdHJpY3QpICU+JSANCiAgc3VtbWFyaXNlKHdvdW5kZWRfZGVhZCA9IHN1bSh3b3VuZGVkX2RlYWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZGFtYWdlZF9ob3VzZXMgPSBzdW0oZGFtYWdlZF9ob3VzZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgIyBXaGVyZSBpcyBBcmloYSwgYW5kIHdoeSBpcyBpdCBzaG93aW5nIHVwIGhlcmUNCiAgZmlsdGVyKGRpc3RyaWN0ICE9ICJBcmloYSIpICU+JSANCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhZG1pbjNwY29kZSAlaW4lIG53X3Bjb2RlMyAmDQogICAgICAgICAgICAgICAgICAgICAgIGFkbWluMm5hbWVfZW4gJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSksIGJ5ID0gImRpc3RyaWN0IikgJT4lIA0KICBtdXRhdGUod291bmRlZF9kZWFkXzEwMGsgPSByb3VuZCh3b3VuZGVkX2RlYWQgLyBwb3B1bGF0aW9uICogMTAwMDAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBkYW1hZ2VkX2hvdXNlc18xMDBrID0gcm91bmQoZGFtYWdlZF9ob3VzZXMgLyBwb3B1bGF0aW9uICogMTAwMDAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBzZWxlY3QoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCB3b3VuZGVkX2RlYWQsIHdvdW5kZWRfZGVhZF8xMDBrLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzLCBkYW1hZ2VkX2hvdXNlc18xMDBrKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpICU+JSANCiAgc2V0X2NhcHRpb24oIkNhc3VhbHRpZXMgYW5kIGRhbWFnZWQgaG91c2VzLCBhYnNvbHV0ZSBmaWd1cmVzIGFuZCBwZXIgMTAwLDAwMCBwZXJzb25zIikgJT4lIA0KICBmb290bm90ZShwYXJ0ID0gImhlYWRlciIsIGkgPSAxLCBqID0gMzo2LCBpbmxpbmUgPSBUUlVFLCByZWZfc3ltYm9scyA9ICIxIiwNCiAgICAgICAgICAgdmFsdWUgPSBhc19wYXJhZ3JhcGgoIkRhdGEgZnJvbSB0aGUgQXNzaXN0YW5jZSBDb29yZGluYXRpb24gVW5pdCwgU3lyaWEgMjAyMzAzMjgiKSkNCmBgYA0KDQo8YnI+DQoNCkJlbG93IGlzIGEgYnJlYWtkb3duIG9mIGJlbmVmaWNpYXJpZXMgYmFzZWQgb24gd2hldGhlciB0aGV5IG9yaWdpbmF0ZSBmcm9tIGNhbXBzIG9yIHZpbGxhZ2VzOiANCg0KPGJyPg0KDQpgYGB7cn0NCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieSh2aWxsYWdlX2NhbXBzKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdCh2aWxsYWdlX2NhbXBzID0gIk5BIikpICU+JSANCiAgbXV0YXRlKGAlX2JlbmVmaWNpYXJpZXNgID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiTW9yZSB0aGFuIHR3aWNlIGFzIG1hbnkgYmVuZWZpY2lhcmllcyBmcm9tIHZpbGxhZ2VzIGFzIGZyb20gY2FtcHMiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNikNCiAgDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDMuMSBCeSBzdWItZGlzdHJpY3QNCg0KVGhlIHBsb3RzIGJlbG93IHNob3cgdGhlIGJyZWFrZG93biBvZiBiZW5lZmljaWFyaWVzIGJ5IHN1Yi1kaXN0cmljdC4gQ2F1dGlvbiBtdXN0IGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IGFsbG9jYXRpb25zIGFyZSBmYWlyIGFjcm9zcyB0aGUgYWZmZWN0ZWQgYXJlYXM6IHRoZXJlIGFyZSBudW1lcm91cyBzdWItZGlzdHJpY3RzIHdoZXJlIGEgdmVyeSBsYXJnZSBwcm9wb3J0aW9uIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVhY2hlZCBieSBtdWx0aS1wdXJwb3NlIGNhc2gsIGluIHBhcnRpY3VsYXIsIEphbmRhaXJpcywgSGFpcm0sIFNhbHFpbiBhbmQgU2hhcmFuLiANCg0KUmVzcG9uc2UgYWN0aXZpdGllcyBtdXN0IGJlIHByb3BvcnRpb25hbCB3aXRoIHRoZSBtYWduaXR1ZGUgYW5kIHNldmVyaXR5IG9mIGVhcnRocXVha2UgZGFtYWdlLiBPdmVyYWxsb2NhdGlvbiBkZXByaXZlcyBhZmZlY3RlZCBwZXJzb25zIG9mIHRoZSBhaWQgdGhleSBhcmUgZHVlLiANCg0KVGhlIGF2ZXJhZ2UgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiByZWFjaGVkLCBvZiBhbGwgc3ViLWRpc3RyaWN0cywgaXMgMTAuNjMlLiANCg0KPGJyPg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTh9DQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKHN1Yl9kaXN0cmljdCA9IHJlY29kZShzdWJfZGlzdHJpY3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYWxxaW4iID0gIlNhbHFpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnJpbiIgPSAiQWZyaW4iKSkgJT4lIA0KICBncm91cF9ieShnb3Zlcm5vcmF0ZSwgc3ViX2Rpc3RyaWN0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoc3ViX2Rpc3RyaWN0ID0gZmN0X3Jlb3JkZXIoc3ViX2Rpc3RyaWN0LCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gc3ViX2Rpc3RyaWN0KSkgKyANCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBnb3Zlcm5vcmF0ZSkpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoYmVnaW4gPSAuMykgKyANCiAgbGFicyh0aXRsZSA9ICJNUEMgYmVuZWZpY2lhcmllcyBieSBkaXN0cmljdCIsIA0KICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJhcyBvZiAiLCByZXBvcnRfZGF0ZSksIA0KICAgICAgIHkgPSAiIikgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KDQpobm8gJT4lIA0KICBmaWx0ZXIoYWRtaW4ybmFtZV9lbiAlaW4lIGMoIkhhcmltIiwgIklkbGViIiwgIkppc3ItQXNoLVNodWd1ciIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lIA0KICBncm91cF9ieShnb3Zlcm5vcmF0ZSA9IGFkbWluMW5hbWVfZW4sIGFkbWluM3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9wb3B1bGF0aW9uID0gc3VtKHRvdGFsX3BvcHVsYXRpb24sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIGxlZnRfam9pbigNCiAgICBjYnIgJT4lDQogICAgICAgbXV0YXRlKHN1Yl9kaXN0cmljdCA9IHJlY29kZShzdWJfZGlzdHJpY3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYWxxaW4iID0gIlNhbHFpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnJpbiIgPSAiQWZyaW4iKSkgJT4lIA0KICAgICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgIA0KICAgICAgZ3JvdXBfYnkoc3ViX2Rpc3RyaWN0LCBhZG1pbjNwY29kZSkgJT4lIA0KICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSwgDQogICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShzdWJfZGlzdHJpY3QpKSAlPiUgDQogIG11dGF0ZShzdWJfZGlzdHJpY3QgPSBmY3RfcmVvcmRlcihzdWJfZGlzdHJpY3QsIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwY19yZWFjaGVkID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHRvdGFsX3BvcHVsYXRpb24gKiAxMDAsIGRpZ2l0cyA9IDEpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjX3JlYWNoZWQsIHkgPSBzdWJfZGlzdHJpY3QpKSArDQogIGdlb21fY29sKGFlcyhmaWxsID0gZ292ZXJub3JhdGUpKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEocGNfcmVhY2hlZCkpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoYmVnaW4gPSAuMykgKyANCiAgbGFicyh0aXRsZSA9ICJQZXJjZW50IG9mIHBvcHVsYXRpb24gcmVhY2hlZCIsIA0KICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJhcyBvZiAiLCByZXBvcnRfZGF0ZSksIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgeCA9ICIlIG9mIHBvcHVsYXRpb24gcmVhY2hlZCIpICsNCiAgDQogIHBsb3RfbGF5b3V0KGd1aWRlcyA9ICJjb2xsZWN0IikgJiANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQoNCmdnc2F2ZSgiLi9pbWcvbXBjX2J5X3N1Yl9kaXN0cmljdC5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDguMjcsIHdpZHRoID0gMTEuNjksIHVuaXRzID0gImluIikgIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjIgQ29tcGFyaXNvbnMgd2l0aCBQSU4gYW5kIGVhcnRocXVha2UgZGFtYWdlDQoNClRoZSBwbG90IGJlbG93IHNob3dzIHRoZSB0b3RhbCBwb3B1bGF0aW9uIG9mIGVhY2ggc3ViLWRpc3RyaWN0IG9uIHRoZSB4LWF4aXMgKGZvciB0aGUgbW9tZW50LCBhbGwgcGVyc29ucyBpbiB0aGVzZSBhcmVhcyBhcmUgYXNzdW1lZCB0byBiZSBhZmZlY3RlZCBhbmQgYXJlIGluY2x1ZGVkIGluIHRoZSBQSU4pIGFuZCB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgb24gdGhlIHktYXhpcy4gDQoNClRoZSBzaXplIG9mIGVhY2ggcG9pbnQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgZGVhZCBvciB3b3VuZGVkIHBlcnNvbnMgdGhlcmUgcGVyIDEwMCwwMDAuIA0KDQo8YnI+DQoNCmBgYHtyIGZpZy5oZWlnaHQ9Nn0NCmVxICU+JSANCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChnb3Zlcm5vcmF0ZSA9IGFkbWluMW5hbWVfZW4sIA0KICAgICAgICAgICAgICAgICAgICAgZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIHN1Yl9kaXN0cmljdCA9IGFkbWluM25hbWVfZW4sIA0KICAgICAgICAgICAgICAgICAgICAgYWRtaW4zcGNvZGUpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lDQogIGZpbHRlcihhZG1pbjNwY29kZSAlaW4lIG53X3Bjb2RlMyAmIA0KICAgICAgICAgICBkaXN0cmljdCAlaW4lIGMoIkhhcmltIiwgIklkbGViIiwgIkppc3ItQXNoLVNodWd1ciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWZyaW4iLCAiSmViZWwgU2FtYW4iLCAiQSd6YXoiLCAiSmFyYWJsdXMiLCAiQWwgQmFiIikpICU+JSANCiAgZ3JvdXBfYnkoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCBzdWJfZGlzdHJpY3QsIGFkbWluM3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZSh3b3VuZGVkX2RlYWQgPSBzdW0od291bmRlZF9kZWFkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGRhbWFnZWRfaG91c2VzID0gc3VtKGRhbWFnZWRfaG91c2VzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhZG1pbjNwY29kZSAlaW4lIG53X3Bjb2RlMyAmDQogICAgICAgICAgICAgICAgICAgICAgIGFkbWluMm5hbWVfZW4gJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zcGNvZGUpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UocG9wdWxhdGlvbiA9IHN1bSh0b3RhbF9wb3B1bGF0aW9uLCBuYS5ybSA9IFRSVUUpKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgbXV0YXRlKHdvdW5kZWRfZGVhZF8xMDBrID0gcm91bmQod291bmRlZF9kZWFkIC8gcG9wdWxhdGlvbiAqIDEwMDAwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgZGFtYWdlZF9ob3VzZXNfMTAwayA9IHJvdW5kKGRhbWFnZWRfaG91c2VzIC8gcG9wdWxhdGlvbiAqIDEwMDAwMCwgZGlnaXRzID0gMikpICU+JSANCiAgICBsZWZ0X2pvaW4oY2JyICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNwY29kZSkgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpLCANCiAgICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBvcHVsYXRpb24sIHkgPSBiZW5lZmljaWFyaWVzKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHdvdW5kZWRfZGVhZF8xMDBrKSkgKyANCiAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IHN1Yl9kaXN0cmljdCksDQogICAgICAgICAgICAgICAgICAgcG9pbnQucGFkZGluZyA9IC41LCANCiAgICAgICAgICAgICAgICAgICBzZWdtZW50LmNvbG9yID0gImdyZXk1MCIsIHNpemUgPSAzKSArDQogIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gYygwLCAzMDAwLCAxMDAwMCwgMzAwMDAsIDEwMDAwMCwgMzAwMDAwLCAxMDAwMDAwKSwgDQogICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEpICsgDQogIHNjYWxlX3lfbG9nMTAoYnJlYWtzID0gYygwLCAxMDAwLCAzMDAwLCAxMDAwMCwgMzAwMDAsIDEwMDAwMCksDQogICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEpICsgDQogIHNjYWxlX3NpemUoYnJlYWtzID0gYygwLCAxMDAsIDUwMCwgMTAwMCwgMzAwMCkpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3VyID0gImJsdWUiLCBzaXplID0gLjUpICsNCiAgbGFicyh0aXRsZSA9ICJQb3B1bGF0aW9uIGFuZCBNUEMgYmVuZWZpY2lhcmllcyBieSBzdWItZGlzdHJpY3QiLA0KICAgICAgIHN1YnRpdGxlID0gIlNpemUgaW5kaWNhdGVzIGRlYWQvd291bmRlZCBwZXIgMTAwLDAwMDAiLCANCiAgICAgICB4ID0gIlBvcHVsYXRpb24iLCANCiAgICAgICB5ID0gIkJlbmVmaWNpYXJpZXMiLCANCiAgICAgICBzaXplID0gIkRlYWQvd291bmRlZFxucGVyIDEwMGsiLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgZnJvbSBDV0csIEZTTCBhbmQgQUNVIikgKw0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpIA0KICANCiANCmBgYA0KDQo8YnI+IA0KDQpUaGUgaGlnaGVyIG9yIGxvd2VyIGEgc3ViLWRpc3RyaWN0IGlzIGFib3ZlIHRoZSBibHVlIGxpbmUsIHRoZSBtb3JlIGRpc3Byb3BvcnRpb25hdGUgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIGFsbG9jYXRlZCB0byB0aGF0IGxvY2F0aW9uIGFyZS4gDQoNClRoaXMgc2hvdWxkIGFsc28gYmUgY29tcGFyZWQgdG8gZWFjaCBzdWItZGlzdHJpY3QncyBzaGFyZSBvZiB0aGUgZWFydGhxdWFrZSBkYW1hZ2UuIE9mIHBhcnRpY3VsYXIgbm90ZSwgc3ViLWRpc3RyaWN0cyBpbiBncmV5IGhhdmUgeWV0IHRvIHJlY2VpdmUgYW55IE1QQyBhc3Npc3RhbmNlLiANCg0KPGJyPg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQplcSAlPiUgDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbiwgDQogICAgICAgICAgICAgICAgICAgICBzdWJfZGlzdHJpY3QgPSBhZG1pbjNuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGFkbWluM3Bjb2RlKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JQ0KICBmaWx0ZXIoYWRtaW4zcGNvZGUgJWluJSBud19wY29kZTMgJiANCiAgICAgICAgICAgZGlzdHJpY3QgJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCwgc3ViX2Rpc3RyaWN0LCBhZG1pbjNwY29kZSkgJT4lIA0KICBzdW1tYXJpc2Uod291bmRlZF9kZWFkID0gc3VtKHdvdW5kZWRfZGVhZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBkYW1hZ2VkX2hvdXNlcyA9IHN1bShkYW1hZ2VkX2hvdXNlcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoYWRtaW4zcGNvZGUgJWluJSBud19wY29kZTMgJg0KICAgICAgICAgICAgICAgICAgICAgICBhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM3Bjb2RlKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSksIA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogIG11dGF0ZSh3b3VuZGVkX2RlYWRfMTAwayA9IHJvdW5kKHdvdW5kZWRfZGVhZCAvIHBvcHVsYXRpb24gKiAxMDAwMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzXzEwMGsgPSByb3VuZChkYW1hZ2VkX2hvdXNlcyAvIHBvcHVsYXRpb24gKiAxMDAwMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogICAgbGVmdF9qb2luKGNiciAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSwgDQogICAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkYW1hZ2VkX2hvdXNlcywgeSA9IHdvdW5kZWRfZGVhZCkpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSB3b3VuZGVkX2RlYWRfMTAwaywgDQogICAgICAgICAgICAgICAgIGNvbG91ciA9IGJlbmVmaWNpYXJpZXMpKSArIA0KICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gc3ViX2Rpc3RyaWN0KSwNCiAgICAgICAgICAgICAgICAgICBwb2ludC5wYWRkaW5nID0gLjUsIA0KICAgICAgICAgICAgICAgICAgIHNlZ21lbnQuY29sb3IgPSAiZ3JleTUwIiwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeF9sb2cxMChsYWJlbHMgPSBjb21tYSkgKyANCiAgc2NhbGVfeV9sb2cxMChsYWJlbHMgPSBjb21tYSkgKyANCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMob3B0aW9uID0gIm1ha28iLCBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hKSArIA0KICBzY2FsZV9zaXplKGJyZWFrcyA9IGMoMCwgMTAwLCA1MDAsIDEwMDAsIDMwMDApKSArIA0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGRhbWFnZWQgaG91c2VzIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2Ygd291bmRlZCBhbmQgZGVhZCIsIA0KICAgICAgIHRpdGxlID0gIk1hZ25pdHVkZSBvZiBlYXJ0aHF1YWtlIGltcGFjdHMgYnkgc3ViLWRpc3RyaWN0IiwgDQogICAgICAgc3VidGl0bGUgPSAiU2l6ZSBzaG93cyBzZXZlcml0eSAod291bmRlZC9kZWFkIHBlciAxMDBrKSBhbmQgY29sb3VyIHNob3dzIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICBzaXplID0gIldvdW5kZWQvZGVhZFxucGVyIDEwMGsiLCANCiAgICAgICBjb2xvdXIgPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBmcm9tIENXRywgRlNMIGFuZCBBQ1UiKQ0KYGBgDQoNCjxicj4NCg0KVGhlIENXRyBpcyBjdXJyZW50bHkgd29ya2luZyBvbiBhIHByaW9yaXRpc2F0aW9uIHNjb3JlLCB3aGljaCBjYW4gYmUgYSB1c2VmdWwgc2hvcnRoYW5kLCB0aGF0IHdpbGwgdGFrZSBpbnRvIGFjY291bnQgcHJlLWV4aXN0aW5nIHZ1bG5lcmFiaWxpdHkgKGxpa2VseSBmcm9tIHRoZSBNU05BKSBhcyB3ZWxsIGFzIGVhcnRocXVha2UgaW1wYWN0cy4gDQoNCjxicj48YnI+DQoNCg0KIyMjIDMuMyBQbGFubmVkIGFjdGl2aXRpZXMgDQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJQbGFubmVkIikgJT4lDQogIGZpbHRlcihnb3Zlcm5vcmF0ZSA9PSAiQWxlcHBvIikgJT4lICANCiAgZ3JvdXBfYnkoc3ViX2Rpc3RyaWN0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGZjdF9yZW9yZGVyKHN1Yl9kaXN0cmljdCwgYmVuZWZpY2lhcmllcykpKSArIA0KICBnZW9tX2NvbChmaWxsID0gIiM0MWI2YzQiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICBsYWJzKHRpdGxlID0gIlBsYW5uZWQgYmVuZWZpY2lhcmllcyAtLSBBbGVwcG8iLCANCiAgICAgICB4ID0gIlBsYW5uZWQgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHkgPSAiIikgKyANCg0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJQbGFubmVkIikgJT4lDQogIGZpbHRlcihnb3Zlcm5vcmF0ZSA9PSAiSWRsZWIiICYgIWlzLm5hKGFkbWluM3Bjb2RlKSkgJT4lICANCiAgZ3JvdXBfYnkoc3ViX2Rpc3RyaWN0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGZjdF9yZW9yZGVyKHN1Yl9kaXN0cmljdCwgYmVuZWZpY2lhcmllcykpKSArIA0KICBnZW9tX2NvbChmaWxsID0gImxpZ2h0Z29sZGVucm9kIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSB1bml0X2Zvcm1hdCh1bml0ID0gIksiLCBzY2FsZSA9IDFlLTMsIGFjY3VyYWN5ID0gMSkpICsgDQogIGxhYnModGl0bGUgPSAiUGxhbm5lZCBiZW5lZmljaWFyaWVzIC0tIElkbGViIiwgDQogICAgICAgeCA9ICJQbGFubmVkIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB5ID0gIiIpICArIA0KDQogIHBsb3RfbGF5b3V0KHdpZHRocyA9IGMoMiwgMykpDQoNCiMgZ2dzYXZlKCIuL2ltZy9wbGFubmVkX2J5X3N1Yl9kaXN0cmljdC5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDguMjcsIHdpZHRoID0gMTEuNjksIHVuaXRzID0gImluIikNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIDQuIENhc2ggcmVzcG9uc2UgYWN0b3JzIGFuZCBjYXNoIGRpc2J1cnNlZA0KDQpJbiB0aGUgc2NhdHRlcnBsb3QgYmVsb3csIGVhY2ggcG9pbnQgaXMgYSBzaW5nbGUgY2FzaCB3b3JraW5nIGdyb3VwIHBhcnRuZXIuIFRoZSB4LWF4aXMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIHBlciBhZ2VuY3kgYW5kIHRoZSB5LWF4aXMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY29tbXVuaXRpZXMgKGFkbWluNCkgcmVhY2hlZC4gDQoNCjxicj4NCg0KYGBge3IgdG90YWxzLCBldmFsID0gRkFMU0V9DQoNCmZzbCAlPiUgDQogIGZpbHRlcihhY3Rpdml0eSA9PSAiQ2FzaCBSZXNwb25zZSIgJiBwbGFubmVkX2ltcGxlbWVudGVkID09ICJJbXBsZW1lbnRlZCIpICU+JSANCiAgbXV0YXRlKHVzZF90b3RhbCA9IGZhbWlsaWVzICogcXVhbnRpdHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICB1c2RfdG90YWwgPSBzdW0odXNkX3RvdGFsLCBuYS5ybSA9IFRSVUUpKQ0KDQpgYGANCg0KDQoNCg0KYGBge3IgcGFydG5lci1zY2F0dGVyfQ0KcGFydG5lcl9zY2F0dGVyIDwtIGNiciAlPiUgDQogICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIsIA0KICAgICAgICAgICBhZG1pbjJwY29kZSwgDQogICAgICAgICAgIGFkbWluNHBjb2RlKSAlPiUgDQogIHNsaWNlKHdoaWNoLm1heChiZW5lZmljaWFyaWVzKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGNvbW11bml0aWVzID0gbl9kaXN0aW5jdChhZG1pbjRwY29kZSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGNvbW11bml0aWVzKSkgKw0KICBnZW9tX3BvaW50KGFlcyhzaXplID0gYmVuZWZpY2lhcmllcywgDQogICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoaW1wbGVtZW50aW5nX3BhcnRuZXIsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiAiLCBmb3JtYXQoYmVuZWZpY2lhcmllcywgYmlnLm1hcmsgPSAiLCIpLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbXVuaXRpZXM6ICIsIGNvbW11bml0aWVzKSkpICsgDQogIHNjYWxlX3hfbG9nMTAobGFiZWxzID0gY29tbWEpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyANCiAgbGFicyh4ID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCIsIA0KICAgICAgIHkgPSAiQ29tbXVuaXRpZXMgKGFkbWluNCkgcmVhY2hlZCIsIA0KICAgICAgIHRpdGxlID0gIkltcGxlbWVudGluZyBwYXJ0bmVycyAtLSBiZW5lZmljaWFyaWVzIGFuZCBjb21tdW5pdGllcyByZWFjaGVkIikNCg0KZ2dwbG90bHkocGFydG5lcl9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpKSAlPiUgDQogIGxheW91dChzaG93bGVnZW5kID0gVFJVRSwgbGVnZW5kID0gbGlzdChmb250ID0gKGxpc3Qoc2l6ZSA9IDYpKSkpICU+JSANCiAgcGxvdGx5OjpzdHlsZShob3Zlcm9uID0gInBvaW50IikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkJlbmVmaWNpYXJpZXMgYW5kIGNvbW11bml0aWVzIHJlYWNoZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXNoIHJlc3BvbnNlIGltcGxlbWVudGluZyBwYXJ0bmVyczsgbW91c2Ugb3ZlciBmb3IgZGV0YWlscyIsIjwvc3VwPiIpKSkNCg0KDQpgYGANCg0KPGJyPg0KDQpVU0QgYHIgcGFzdGUocm91bmQoY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfdXNkKX0gLyAxMDAwMDAwLCBkaWdpdHMgPSAxKSwgIm1pbGxpb24iKWAgaGFzIGJlZW4gZGlzdHJpYnV0ZWQgYWNyb3NzIGByIGNiciAlPiUgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge25fZGlzdGluY3QoLiRhZG1pbjRwY29kZSl9YCBjb21tdW5pdGllcyBhbmQgYHIgY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7bl9kaXN0aW5jdCguJGFkbWluM3Bjb2RlKX1gIHN1Yi1kaXN0cmljdHMgaW4gTlcgU3lyaWEuDQoNCg0KVGhlIHRhYmxlIGJlbG93IHN1bW1hcmlzZXMgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzY2F0dGVycGxvdCBhYm92ZSBpbiB0YWJ1bGFyIGZvcm06DQoNCjxicj4NCg0KDQpgYGB7cn0NCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lciwgDQogICAgICAgICAgIGFkbWluMnBjb2RlLCANCiAgICAgICAgICAgYWRtaW40cGNvZGUpICU+JSANCiAgc2xpY2Uod2hpY2gubWF4KGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZGlzdHJpY3RzID0gbl9kaXN0aW5jdChhZG1pbjJwY29kZSksIA0KICAgICAgICAgICAgY29tbXVuaXRpZXMgPSBuX2Rpc3RpbmN0KGFkbWluNHBjb2RlKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiUmVhY2ggYW5kIGZvb3RwcmludCBvZiBjYXNoIHJlc3BvbnNlIGFjdG9ycyIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOCkgJT4lIA0KICBmb290bm90ZShhc19wYXJhZ3JhcGgoIk9ubHkgcGFydG5lcnMgd2hvIHByb3ZpZGVkIG1vcmUgdGhhbiBVU0QgMTAwL2ZhbWlseS9tb250aCIpLCANCiAgICAgICAgICAgaSA9IDEsIGogPSAxLCBwYXJ0ID0gImhlYWRlciIsIGlubGluZSA9IFRSVUUsIHJlZl9zeW1ib2xzID0gIjEiKQ0KICANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC4xIFVTRCBkaXNidXJzZWQgcGVyIHBhcnRuZXINCg0KPGJyPg0KDQpgYGB7cn0NCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfdXNkID0gc3VtKHRvdGFsX3VzZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBmYW1pbGllcyA9IHN1bShmYW1pbGllcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUodXNkX3Blcl9mYW0gPSByb3VuZCh0b3RhbF91c2QgLyBmYW1pbGllcywgZGlnaXRzID0gMiksIA0KICAgICAgICAgYCVfdXNkX3RvdGFsYCA9IHJvdW5kKHRvdGFsX3VzZCAvIHN1bSh0b3RhbF91c2QpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfdXNkKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJVU0QgZGlzYnVyc2VkIGFuZCBmYW1pbGllcyByZWFjaGVkIGJ5IHBhcnRuZXIiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBmbGV4dGFibGU6OnNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOCkNCmBgYA0KDQo8YnI+DQoNClRoZSBDV0cgaXMgY3VycmVudGx5IHdvcmtpbmcgd2l0aCBvdGhlciBDbHVzdGVycyB0byBjb25zb2xpZGF0ZSBhbGwgY2FzaC1iYXNlZCBhY3Rpdml0aWVzIGFuZCB3aWxsIHNvb24gYmUgYWJsZSB0byBwcm92aWRlIG1vcmUgY29tcHJlaGVuc2l2ZSByZXBvcnRpbmcuIA0KDQoNCjxicj48YnI+PGJyPg0KDQojIDUuIEFubmV4ZXMNCg0KPGJyPg0KDQojIyMgNS4xIEludGVyYWN0aXZlIHJlZmVyZW5jZSB0YWJsZSBhdCBzdWItZGlzdHJpY3QgbGV2ZWwNCg0KQ29sdW1ucyBpbmNsdWRlOiANCmBnb3Zlcm5vcmF0ZWAsIGBkaXN0cmljdGAsIGBzdWItZGlzdHJpY3RgLCANCmB0b3RhbCBwb3B1bGF0aW9uYCwgYGJlbmVmaWNpYXJpZXNgLCBgdG90YWwgdXNkIGRpc2J1cnNlZGAsIA0KYHdvdW5kZWQgYW5kIGRlYWRgLCBgd291bmRlZCBhbmQgZGVhZCBwZXIgMTAwa2AsIA0KYGRhbWFnZWQgaG91c2VzYCwgYGRhbWFnZWQgaG91c2VzIHBlciAxMDBrYCwgDQpgYWRtaW4zcGNvZGVgDQoNCmBgYHtyfQ0KZXEgJT4lIA0KICBsZWZ0X2pvaW4obG9jYXRpb25zICU+JSBkaXN0aW5jdChhZG1pbjNwY29kZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfZGlzdHJpY3QgPSBhZG1pbjNuYW1lX2VuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgbGVmdF9qb2luKGNiciAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNwY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3VzZCA9IHN1bSh0b3RhbF91c2QsIG5hLnJtID0gVFJVRSkpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICBzZWxlY3QoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCBzdWJfZGlzdHJpY3QsIA0KICAgICAgICAgdG90YWxfcG9wdWxhdGlvbiwgDQogICAgICAgICBiZW5lZmljaWFyaWVzLCB0b3RhbF91c2QsIA0KICAgICAgICAgd291bmRlZF9kZWFkLCB3b3VuZGVkX2RlYWRfMTAwaywgDQogICAgICAgICBkYW1hZ2VkX2hvdXNlcywgZGFtYWdlZF9ob3VzZXNfMTAwaywgDQogICAgICAgICBhZG1pbjNwY29kZSkgJT4lIA0KICBkYXRhdGFibGUob3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSksIA0KICAgICAgICAgICAgZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZToxMjAlIDsnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZmVyZW5jZSB0YWJsZSAtLSBFYXJ0aHF1YWtlIGltcGFjdHMsIGZyb20gQUNVLCBleHRyYWN0ZWQgMjAyMzAzMjgiKSkgJT4lIA0KICBmb3JtYXRTdHlsZSgwLCB0YXJnZXQgPSAicm93IiwgbGluZUhlaWdodCA9ICI4MCUiLCBmb250U2l6ZSA9ICI4MCUiKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoIndvdW5kZWRfZGVhZF8xMDBrIiwgImRhbWFnZWRfaG91c2VzXzEwMGsiKSwgZGlnaXRzID0gMikgJT4lIA0KICBmb3JtYXRDdXJyZW5jeShjKCJ0b3RhbF9wb3B1bGF0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgIndvdW5kZWRfZGVhZCIsICJkYW1hZ2VkX2hvdXNlcyIsIA0KICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzIiwgInRvdGFsX3VzZCIpLCANCiAgICAgICAgICAgICAgICAgY3VycmVuY3kgPSAiIiwgaW50ZXJ2YWwgPSAzLCBtYXJrID0gIiwiKSAlPiUNCiAgZm9ybWF0Um91bmQoYygidG90YWxfcG9wdWxhdGlvbiIsIA0KICAgICAgICAgICAgICAgICJ3b3VuZGVkX2RlYWQiLCAiZGFtYWdlZF9ob3VzZXMiLA0KICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzIiwgInRvdGFsX3VzZCIpLCBkaWdpdHMgPSAwKQ0KICANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNS4yIFJlcG9ydGluZyBxdWFsaXR5IA0KDQpUaGlzIHNlY3Rpb24gZG9jdW1lbnRzIGlzc3VlcyBlbmNvdW50ZXJlZCBpbiB0aGUgY2xlYW5pbmcgb2YgNFcgYW5kIEZTTCBkYXRhIGFuZCB0aGVpciBpbXBhY3RzIG9uIHRoZSBxdWFsaXR5IG9mIHJlcG9ydGluZyB0aGUgQ1dHIGNhbiBwcm92aWRlLiANCg0KTm90ZSB0aGF0IHN1YnN0YW50aWFsIGNsZWFuaW5nIGhhcyBhbHJlYWR5IHRha2VuIHBsYWNlIGFuZCB0aGVzZSBvdXRzdGFuZGluZyBpc3N1ZXMgY291bGQgbm90IGJlIHJlc29sdmVkIGJ5IHRoZSB0aW1lIG9mIHJlcG9ydGluZy4gDQoNCkhvd2V2ZXIsIHRoZSBDV0cgcmVjb2duaXNlcyB0aGF0IG5vdCBhbGwgcmVwb3J0aW5nIGlzc3VlcyB3ZXJlIGR1ZSB0byBwYXJ0bmVyIGVycm9yLiBUaGUgQ1dHIHdpbGwgd29yayB3aXRoIHBhcnRuZXJzIHRvIGNvbnRpbnVlIGltcHJvdmluZyByZXBvcnRpbmcgcXVhbGl0eS4gDQoNCjxicj4gDQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KHNvdXJjZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwNCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGAlX2JlbmVmaWNpYXJpZXNgID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiU3RpbGwsIG9uZSB0aGlyZCBvZiByZXBvcnRpbmcgb3JpZ2luYXRlcyBmcm9tIHRoZSBGU0wgdHJhY2tlciIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUNCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC42KQ0KYGBgDQoNCjxicj4NCg0KQmVsb3cgaXMgYSBicmVha2Rvd24gb2YgcmVwb3J0aW5nIGJ5IGRhdGU6IA0KDQo8YnI+DQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KG1vbnRoID0gbW9udGgoZGlzdHJpYnV0aW9uX2RhdGUsIGxhYmVsID0gVFJVRSkpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIkphbnVhcnkgcmVwb3J0aW5nIGlzIHN0aWxsIGxhcmdlbHkgaW5jb21wbGV0ZSIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUNCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC42KQ0KYGBgDQoNCjxicj4gDQoNCkFjdGl2aXRpZXMgcGVydGFpbmluZyB0byAxNCw0MzIgd2VyZSBtaXNzaW5nIHRoZWlyIGRhdGUgb3IgaGFkIGRhdGVzIGluIHVucmVhZGFibGUgZm9ybWF0cy4gSG93ZXZlciwgdGhlIGNvbHVtbnMgYHN0YXJ0IGRhdGVgLCBgZW5kIGRhdGVgIGFuZCBgbW9udGggb2YgcmVwb3J0aW5nYCB3ZXJlIHNvbWUgb2YgdGhlIG1vc3QgdHJvdWJsZXNvbWUgYW5kIGNvbnN1bWVkIGEgbGFyZ2UgcGFydCBvZiB0aGUgdGltZSBkZWRpY2F0ZWQgdG8gZGF0YSBjbGVhbmluZy4gDQoNClRoZSBDV0cgd291bGQgbGlrZSB0byByZWl0ZXJhdGUgdGhhdCBgc3RhcnQgZGF0ZWAgYW5kIGBlbmQgZGF0ZWAgc2hvdWxkIGJlIGVudGVyZWQgaW4gdGhlIGZvcm1hdCBtbS9kZC95eXl5IGFuZCB0aGF0IGBtb250aCBvZiByZXBvcnRpbmdgIHNob3VsZCBiZSBzZWxlY3RlZCBmcm9tIHRoZSBkcm9wZG93biBtZW51LiANCg0KPGJyPg0KDQpgYGB7cn0NCmNiciAlPiUgZ3JvdXBfYnkocHJvamVjdF9zdGF0dXMpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIjEyIHBhcnRuZXJzIGhhdmUgcmVwb3J0ZWQgcGxhbm5lZCBhY3Rpdml0aWVzIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JQ0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjYpDQpgYGANCg0KPGJyPg0KDQpUaGUgc3VtIG9mIHBsYW5uZWQgYmVuZWZpY2lhcmllcyBpcyBgciBmb3JtYXQoZmlsdGVyKGNiciwgcHJvamVjdF9zdGF0dXMgPT0gIlBsYW5uZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSwgYmlnLm1hcmsgPSAiLCIpYC4gSWYgdGhpcyBpcyB0aGUgZXh0ZW50IG9mIGFsbCBwbGFubmVkIE1QQyBhY3Rpdml0aWVzLCB0aGUgQ1dHIGFzIGEgd2hvbGUgY2FuIGV4cGVjdCB0byByZWFjaCBhcm91bmQgNzclIG9mIGl0cyB0YXJnZXQgb2YgNjYyLDk0MiBwZXJzb25zLiANCg0KQmVsb3cgaXMgYSBicmVha2Rvd24gb2YgcGxhbm5lZCBhY3RpdGl2aXRpZXMgYnkgc291cmNlOg0KDQo8YnI+DQoNCg0KYGBge3J9DQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIlBsYW5uZWQiKSAlPiUgDQogIGdyb3VwX2J5KHNvdXJjZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKGAlX2JlbmVmaWNpYXJpZXNgID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiQnJlYWtkb3duIG9mIHBsYW5uZWQgYWN0aXZpdGllcyBieSBzb3VyY2UiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNikNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyA1LjMgRGlzYWdncmVnYXRpb25zIA0KDQoNCk9mIHRoZSA1NjUgcm93cyByZXBvcnRlZCB0aHJvdWdoIHRoZSA0V3MgKHRoZSBGU0wgdHJhY2tlciBkb2VzIG5vdCBhc2sgZm9yIGJlbmVmaWNpYXJ5IGRpc2FnZ3JlZ2F0aW9ucyksIG9ubHkgYHIgZm91ciAlPiUgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgZmlsdGVyKCFpcy5uYShlbGRlcmx5X2ZlbWFsZXNfNjApIHwgIWlzLm5hKGVsZGVybHlfbWFsZXNfNjApKSAlPiUgbnJvdygpYCBoYXZlIGFueSB2YWx1ZXMgZm9yIHRoZSBudW1iZXJzIG9mIGVsZGVybHkgcGVyc29ucyByZWFjaGVkLiANCg0KVGhlIHRvdGFsIG51bWJlciBvZiBlbGRlcmx5IHBlcnNvbnMgcmVhY2hlZCBieSB0aGUgQ1dHIHBhcnRuZXJzIGlzIGByIGZvdXIgJT4lIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHN1bW1hcmlzZShlbGRlcmx5ID0gcm91bmQoc3VtKGVsZGVybHlfZmVtYWxlc182MCwgbmEucm0gPSBUUlVFKSArIHN1bShlbGRlcmx5X21hbGVzXzYwLCBuYS5ybSA9IFRSVUUpLCBkaWdpdHMgPSAwKSkgJT4lIHB1bGwoKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAuIFRoZSB0b3RhbCBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGlzIGByIGZpbHRlcihjYnIsIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYC4gDQoNCkl0IGlzIHVuY2xlYXIgaG93IGFibGUgcGFydG5lcnMgYXJlIHRvIGNvbXBseSB3aXRoIHNleC0gYW5kIGFnZS1kaXNhZ2dyZWdhdGVkIHJlcG9ydGluZy4gNDUyIG9mIHRoZSA1NjUgcm93cyByZXBvcnRlZCB0aHJvdWdoIHRoZSA0V3MgY29udGFpbiBzb21lIGZvcm0gb2Ygc2V4LWFuZC1hZ2UgZGlzYWdncmVnYXRpb24uIE9mIHRoZXNlLCBvbmx5IDM2NiByb3dzIGhhdmUgbm90IGNvcHkvcGFzdGVkIHRoZSBkaXNhZ2dyZWdhdGlvbnMgZnJvbSB0aGUgTVNOQSAoMTMlIG1lbiwgMjclIHdvbWVuLCAyOCUgYm95cyBhbmQgMzElIGdpcmxzKS4gRm9yIGFuYWx5c2lzIHB1cnBvc2VzLCB0aGVzZSBoYXZlIGJlZW4gZGlzY2FyZGVkLiBJbiBmdXR1cmUsIGl0IGlzIGFsd2F5cyBwcmVmZXJhYmxlIHRvIGxlYXZlIGRpc2FnZ3JlZ2F0aW9uIGNvbHVtbnMgYmxhbmsgYXMgb3Bwb3NlZCB0byBpbmNsdWRpbmcgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIGJhY2tmaWxsZWQgZnJvbSBhIGNlbnN1cyBvciBhIHN1cnZleSwgZXNwZWNpYWxseSBhcyB0aGlzIGJhY2tmaWxsaW5nIHdpbGwgYmUgZG9uZSBieSBPQ0hBIGFzIGEgZmluYWwgc3RlcCBpbiByZXBvcnRpbmcgYW55d2F5LiANCg0KVGhpcyBpcyBhIGhpc3RvZ3JhbSBvZiB0aGUgcmVtYWluaW5nIHZhbHVlczogDQoNCjxicj4NCg0KYGBge3J9DQpmb3VyICU+JSANCiAgZmlsdGVyKCFpcy5uYShtZW5fMThfNjApIHwgIWlzLm5hKHdvbWVuXzE4XzYwKSB8ICFpcy5uYShib3lzXzE4KSB8ICFpcy5uYShnaXJsc18xOCkpICU+JSANCiAgc2VsZWN0KGJlbmVmaWNpYXJpZXMsIG1lbl8xOF82MCwgd29tZW5fMThfNjAsIGJveXNfMTgsIGdpcmxzXzE4KSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKCJyb3ciKSAlPiUgIA0KICBmaWx0ZXIobWVuXzE4XzYwICE9IC4xMyAgJiB3b21lbl8xOF82MCAhPSAuMjcpICU+JSANCiAgbXV0YXRlKHBjX21hbGUgPSBtZW5fMThfNjAgKyBib3lzXzE4KSAgJT4lICANCiAgZ2dwbG90KGFlcyh4ID0gcGNfbWFsZSkpICsgDQogIGdlb21fZGVuc2l0eShjb2xvdXIgPSAiYmx1ZSIsIGFscGhhID0gLjcpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA1MCwgYWxwaGEgPSAuOCkgKyANCiAgc2NhbGVfeF9sb2cxMChsYWJlbHMgPSBwZXJjZW50KSArIA0KICBsYWJzKHRpdGxlID0gIkFibm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiBtZW4gYXMgcGVyY2VudGFnZSBvZiBpbmRpdmlkdWFscyByZWFjaGVkIiwgDQogICAgICAgeCA9ICJNYWxlcyBhcyAlIG9mIHRvdGFsIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2Ygcm93cyIpDQpgYGANCg0KPGJyPg0KDQpUaGlzIGRpZmZlcnMgcXVpdGUgc2lnbmlmaWNhbnRseSBmcm9tIHdoYXQgd2Ugd291bGQgZXhwZWN0IHRvIHNlZSBpbiB0aGUgZ2VuZXJhbCBwb3B1bGF0aW9uIGFuZCBpcyBpbmRpY2F0aXZlIG9mICJ1bm5hdHVyYWwiIGRhdGEgaS5lLiBjb3B5L3Bhc3Rpbmcgb3IgYnJvYWQgZXN0aW1hdGlvbnMsIGFzIG9wcG9zZWQgdG8gYWN0dWFsIGNvdW50cy4gVGhlIHBlYWtzIGFyb3VuZCA0OSUgYW5kIDUwJSBzaG93IHRoYXQgdGhlc2Ugc2FtZSBwZXJjZW50YWdlcyB3ZXJlIGNvcHkvcGFzdGVkIG9udG8gYSBsYXJnZSBudW1iZXIgb2Ygcm93cy4gDQoNCkZvciByZWZlcmVuY2UsIHRoaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgbWFsZXMgYXMgYSBwcm9wb3J0aW9uIG9mIHRoZSBwZW9wbGUgaW4gbmVlZCBwZXIgc3ViLWRpc3RyaWN0LiBUaGUgZGlzdHJpYnV0aW9uIGlzIHJvdWdobHkgbm9ybWFsIGFuZCB3ZSBjYW4gc2VlIHRoYXQgdGhlc2UgYXJlICJyZWFsIiBmaWd1cmVzLiANCg0KPGJyPg0KDQpgYGB7cn0NCmhubyAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1hbGVfcGVyY2VudCkpICsgDQogIGdlb21fZGVuc2l0eShjb2xvdXIgPSAiYmx1ZSIsIGFscGhhID0gLjcpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA1MCwgYWxwaGEgPSAuOCkgKyANCiAgc2NhbGVfeF9sb2cxMChsYWJlbHMgPSBwZXJjZW50KSArIA0KICBsYWJzKHRpdGxlID0gIk5vcm1hbCBkaXN0cmlidXRpb24gb2YgbWVuIGFzIHBlcmNlbnRhZ2Ugb2YgUElOIGluIFN5cmlhIiwgDQogICAgICAgeCA9ICJNYWxlcyBhcyAlIG9mIHRvdGFsIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2Ygc3ViLWRpc3RyaWN0cyIpDQpgYGANCg0KDQo8YnI+IA0KDQoNClVudGlsIHN1Y2ggdGltZSBjb3B5L3Bhc3RlZCB2YWx1ZXMgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIHNleC1hbmQtYWdlIGRpc2dncmVnYXRpb25zLCBpdCB3b3VsZCBiZSBpbmNvcnJlY3QgdG8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBtZW4sIHdvbWVuLCBib3lzIGFuZCBnaXJscyByZWFjaGVkIGZyb20gdGhlIDRXIHZhbHVlcy4gVGhpcyBhbHNvIG1lYW5zIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIHNrZXcgdG93YXJkcyBlaXRoZXIgc2V4IGluIG91ciBjdXJyZW50IHByb2dyYW1taW5nLiANCg0KDQoNCg0KDQoNCg0KDQo=